<?php
namespace Ader\Controller;

class RechargeController extends Controller {

    public function index() {
        $m    = D2();
        $sort = $this->sortExpr;
        $page = $m->where($this->indexExpr)->order($sort)->page2();

        $this->assign('page', $page)->display();
    }

    public function doAdd() {
        $money = I('post.money', 0, 'floatval');

        include(APP_PATH . '/yeepay/yeepayCommon.php');

        if($money < C('RECHARGE_MIN_MONEY')) {
            header('Location:?m=Recharge&a=add');
            exit();
        }

        $dao = array(
            'r_money'      => $money,
            'r_gateway'    => 'yeepay',
            'r_crate_time' => time(),
            'r_operator'   => 'yeepay',
            'r_status'     => 1,
            'uid'          => C('RUN_LOGIN_USER.uid'),
        );

        C('C_DB_WRITE', 1);
        $m = D2();

        if(!$id = $m->add($dao)) {
            throw new ThinkException('保存充值数据出错');
        }

        #	商家设置用户购买商品的支付信息.
        ##易宝支付平台统一使用GBK/GB2312编码方式,参数如用到中文，请注意转码

        $arg = array(
            'p0_Cmd'   => $p0_Cmd,
            'p1_MerId' => $p1_MerId,
            'p9_SAF'   => $p9_SAF,
            'p2_Order' => '', //订单号
            'p3_Amt'   => $money, //支付金额,必填. 单位:元，精确到分.
            'p4_Cur'   => "CNY", //交易币种,固定值"CNY".
            'p5_Pid'   => 'Pay', //商品名称 用于支付时显示在易宝支付网关左侧的订单产品信息.
            'p6_Pcat'  => 'Default', //商品种类
            'p7_Pdesc' => 'pay', //商品描述
            'p8_Url'   => C('RECHARGE_CALLBACK_API'), //商户接收支付成功数据的地址,支付成功后易宝支付会向该地址发送两次成功通知.
            'pa_MP'    => "id={$id}", //商户扩展信息 商户可以任意填写1K 的字符串,支付成功时将原样返回.

            //支付通道编码 
            //默认为""，到易宝支付网关.若不需显示易宝支付的页面，直接跳转到各银行、神州行支付、骏网一卡通等支付页面，该字段可依照附录:银行列表设置参数值.
            'pd_FrpId'        => '',
            'pr_NeedResponse' => "1",  //应答机制 默认为"1": 需要应答机制
            'reqURL_onLine'   => $reqURL_onLine,
        );

        #调用签名函数生成签名串
        $arg['hmac'] = getReqHmacString(
            $arg['p2_Order'],
            $arg['p3_Amt'],
            $arg['p4_Cur'],
            $arg['p5_Pid'],
            $arg['p6_Pcat'],
            $arg['p7_Pdesc'],
            $arg['p8_Url'], 
            $arg['pa_MP'], 
            $arg['pd_FrpId'],
            $arg['pr_NeedResponse']
        );

        $this->assign('arg', $arg)->display();
    }

    public function addCallback() {
        include APP_PATH . '/yeepay/yeepayCommon.php';	
        $logFile = C('LOG_PATH') . 'yeepay_' . date('Ymd') . '.log';

        #	只有支付成功时易宝支付才会通知商户.
        ##支付成功回调有两次，都会通知到在线支付请求参数中的p8_Url上：浏览器重定向;服务器点对点通讯.

        #	解析返回参数.
        $return = getCallBackValue($r0_Cmd,$r1_Code,$r2_TrxId,$r3_Amt,$r4_Cur,$r5_Pid,$r6_Order,$r7_Uid,$r8_MP,$r9_BType,$hmac);

        #	判断返回签名是否正确（True/False）
        $bRet = CheckHmac($r0_Cmd,$r1_Code,$r2_TrxId,$r3_Amt,$r4_Cur,$r5_Pid,$r6_Order,$r7_Uid,$r8_MP,$r9_BType,$hmac);
        #	以上代码和变量不需要修改.

        //Log::write(var_export(get_defined_vars(), true), null, null, $logFile);

        $money = $r3_Amt;
        parse_str($r8_MP, $tmp);
        $id = $tmp['id'];

        #	校验码正确.
        if($bRet){
            if($r1_Code=="1"){

                #	需要比较返回的金额与商家数据库中订单的金额是否相等，只有相等的情况下才认为是交易成功.
                #	并且需要对返回的处理进行事务控制，进行记录的排它性处理，在接收到支付结果通知后，判断是否进行过业务逻辑处理，不要重复进行业务逻辑处理，防止对同一条交易重复发货的情况发生.      	  	

                C('C_DB_WRITE', 1);
                $ok = 1;    //充值数据是正确性,1表示正确,0表示错误
                $m = D2();

                if(!$record = $m->getByRId($id)) {
                    $ok = 0;
                    Log::write("未找到充值记录,ID:{$id}", null, null, $logFile);
                }

                if($record['r_status'] == 2) {
                    $ok = 0;
                    Log::write("ID:{$id}已经支付成功", null, null, $logFile);
                }

                if($ok) {
                    $dao = array(
                        'r_id'          => $id,
                        'r_status'      => 2,
                        'r_finish_time' => date('Y-m-d H:i:s'),
                    );

                    $m->startTrans();

                    if(!$m->save($dao)) {
                        Log::write("更新充值记录出错，ID:{$id}", null, null, $logFile);
                        $ok = false;
                        $m->rollback();
                    }

                    if($ok) {
                        $mUser = D2('User');
                        $uid = $record['uid'];

                        if(!$mUser->where(array('uid' => $uid))->setInc('daymoney', $record['r_money'])) {
                            Log::write("更新广告主余额出错，UID:{$uid}, 充值ID:{$id}", null, null, $logFile);
                            $ok = 0;
                            $m->rollback();
                        }
                    }

                    if($ok) {
                        $m->commit();
                    }
                }

                if($r9_BType=="1"){
                    echo "交易成功";
                    echo  "<br />在线支付页面返回";
                }elseif($r9_BType=="2"){
                    #如果需要应答机制则必须回写流,以success开头,大小写不敏感.
                    echo "success";
                    echo "<br />交易成功";
                    echo  "<br />在线支付服务器返回";      			 
                }
            }

        }else{
            echo "交易信息被篡改";
        }
    }

}
